/**************************************************************************//**
 * @item     CosyOS-II Kernel
 * @file     ur_api.h
 * @brief    用户API（创建API、任务API、滴答API、中断API、公共API）
 * @author   迟凯峰
 * @version  V1.0.1
 * @date     2023.10.25
 ******************************************************************************/

#ifndef __UR_API_H
#define __UR_API_H



/*
 * 声明任务
 */

/* 无私信 */
#define uExternTask(task) \
	sCSV_ExternTask(task)

/* 有私信 */
#define uExternTask_Msg(task)/*<...)>*/ \
	sCSV_ExternTask_Msg(task)



/*
 * 创建任务
 */

/* 创建一般任务 */
#define uCreateTask(task, pri, tss, srt, ndm)/*[(...)]<{任务代码}>*/ \
	sCSV_CreateTask(task, pri, tss, srt, ndm)

/* 创建定时中断任务 */
#define uCreateTask_TimInt(tmid, arl, task, pri, tss, srt, ndm)/*[(...)]<{任务代码}>*/ \
	sCSV_CreateTask_TimInt(tmid, arl, task, pri, tss, srt, ndm)

/* 创建定时查询任务 */
#define uCreateTask_TimQry(tmid, event, arl, task, pri, tss, srt, ndm)/*[(...)]<{任务代码}>*/ \
	sCSV_CreateTask_TimQry(tmid, event, arl, task, pri, tss, srt, ndm)



/*
 * 创建钩子
 */

/* 创建定时中断钩子 */
#define uCreateHook_TimInt(tmid, arl, hook)/*<{钩子代码}>*/ \
	sCSV_CreateHook_TimInt(tmid, arl, hook)

/* 创建定时查询钩子 */
#define uCreateHook_TimQry(tmid, event, arl, hook)/*<{钩子代码}>*/ \
	sCSV_CreateHook_TimQry(tmid, event, arl, hook)



/*
 * 启动任务
 */

/* 启动任务 */
#define /*|ecode|*/uStartTask(task, status) sUSV_StartTask(&u_taskhand_##task, status)

/* 启动任务并就绪 */
#define /*|ecode|*/uStartTask_Ready(task)   sUSV_StartTask(&u_taskhand_##task, OS_STATUS_READY)

/* 启动任务并挂起 */
#define /*|ecode|*/uStartTask_Suspend(task) sUSV_StartTask(&u_taskhand_##task, OS_STATUS_SUSPENDED)



/*
 * 操作任务
 */

/* 恢复任务 */
#define /*|ecode|*/uResumeTask(task)        sUSV_ResumeTask(sTaskNode(&u_taskhand_##task))
#define /*|ecode|*/tResumeTask(task)        sTSV_ResumeTask(sTaskNode(&u_taskhand_##task))
#define            iResumeTask(task)        sPSV_ResumeTask(sTaskNode(&u_taskhand_##task))

/* 挂起任务 */
#define /*|ecode|*/uSuspendTask(task)       sUSV_SuspendTask(sTaskNode(&u_taskhand_##task))
#define /*|ecode|*/tSuspendTask(task)       sTSV_SuspendTask(sTaskNode(&u_taskhand_##task))
#define            iSuspendTask(task)       sPSV_SuspendTask(sTaskNode(&u_taskhand_##task))

/* 删除任务 */
#define /*|ecode|*/uDeleteTask(task)        sUSV_DeleteTask(sTaskNode(&u_taskhand_##task))
#define /*|ecode|*/tDeleteTask(task)        sTSV_DeleteTask(sTaskNode(&u_taskhand_##task))
#define            iDeleteTask(task)        sPSV_DeleteTask(sTaskNode(&u_taskhand_##task))

/* 设置任务优先级 */
#define /*|ecode|*/uSetTaskPri(task, pri)   sUSV_SetTaskPri(sTaskNode(&u_taskhand_##task), pri)
#define /*|ecode|*/tSetTaskPri(task, pri)   sTSV_SetTaskPri(sTaskNode(&u_taskhand_##task), pri)
#define            iSetTaskPri(task, pri)   sPSV_SetTaskPri(sTaskNode(&u_taskhand_##task), pri)



/*
 * 操作自身任务
 */

/* 设置自身任务优先级 */
#define /*|ecode|*/uSetTaskingPri(pri)      sUSV_SetTaskPri(s_task_current, pri)

/* 挂起自身任务 */
#define /*|ecode|*/uSuspendTasking          sUSV_SuspendTask(s_task_current)

/* 删除自身任务 */
#define /*|ecode|*/uDeleteTasking           sUSV_DeleteTask(s_task_current)

/* 恢复指定任务并挂起自身任务 */
#define /*|ecode|*/uResumeSuspend(task)     sUSV_ResumeSuspend(sTaskNode(&u_taskhand_##task))

/* 结束自身任务 */
#define uEndTasking   }while(true)



/*
 * 设置阻塞（时间）
 */

/* 滴答周期 */
#define /*|res|*/uSetBlock_tc(task, tc) sUSV_SetBlock(sTaskNode(&u_taskhand_##task), tc)
#define /*|res|*/tSetBlock_tc(task, tc) sTSV_SetBlock(sTaskNode(&u_taskhand_##task), tc)
#define          iSetBlock_tc(task, tc) sPSV_SetBlock(sTaskNode(&u_taskhand_##task), tc)

/* 毫秒 */
#define /*|res|*/uSetBlock_ms(task, ms) uSetBlock_tc(task, (1000UL * ms) / SYSCFG_SYSTICKCYCLE)
#define /*|res|*/tSetBlock_ms(task, ms) tSetBlock_tc(task, (1000UL * ms) / SYSCFG_SYSTICKCYCLE)
#define          iSetBlock_ms(task, ms) iSetBlock_tc(task, (1000UL * ms) / SYSCFG_SYSTICKCYCLE)

/* 秒钟 */
#define /*|res|*/uSetBlock_s(task, s)   uSetBlock_ms(task, 1000UL * s)
#define /*|res|*/tSetBlock_s(task, s)   tSetBlock_ms(task, 1000UL * s)
#define          iSetBlock_s(task, s)   iSetBlock_ms(task, 1000UL * s)

/* 分钟 */
#define /*|res|*/uSetBlock_m(task, m)   uSetBlock_s(task, 60UL * m)
#define /*|res|*/tSetBlock_m(task, m)   tSetBlock_s(task, 60UL * m)
#define          iSetBlock_m(task, m)   iSetBlock_s(task, 60UL * m)

/* 小时 */
#define /*|res|*/uSetBlock_h(task, h)   uSetBlock_m(task, 60UL * h)
#define /*|res|*/tSetBlock_h(task, h)   tSetBlock_m(task, 60UL * h)
#define          iSetBlock_h(task, h)   iSetBlock_m(task, 60UL * h)



/*
 * 清除阻塞（状态）
 */

#define /*|res|*/uClearBlock(task)      sUSV_ClearBlock(sTaskNode(&u_taskhand_##task))
#define /*|res|*/tClearBlock(task)      sTSV_ClearBlock(sTaskNode(&u_taskhand_##task))
#define          iClearBlock(task)      sPSV_ClearBlock(sTaskNode(&u_taskhand_##task))



/*
 * 自身任务延时
 */

/* 延时滴答周期 */
#define uDelay_tc(tc) sUSV_Delay(tc)

/* 延时毫秒 */
#define uDelay_ms(ms) uDelay_tc((1000UL * ms) / SYSCFG_SYSTICKCYCLE)

/* 延时秒钟 */
#define uDelay_s(s)   uDelay_ms(1000UL * s)

/* 延时分钟 */
#define uDelay_m(m)   uDelay_s(60UL * m)

/* 延时小时 */
#define uDelay_h(h)   uDelay_m(60UL * h)



/*
 * 互斥信号量
 */

/* 声明 */
#define uExternMut(mut)            sCSV_ExternMut(mut)

/* 创建 */
#define uCreateMut(mut)            sCSV_CreateMut(mut)

/* 获取 */
#define /*|res|*/uTakeMut(mut, tc) sUSV_TakeMut(mut, tc)

/* 释放 */
#define /*|ecode|*/uGiveMut(mut)   sUSV_GiveMut(mut)



/*
 * 二值信号量
 */

/* 声明 */
#define uExternBin(bin)             sCSV_ExternBin(bin)

/* 创建 */
#define uCreateBin(bin)/*[= init]*/ sCSV_CreateBin(bin)

/* 等待 */
#define /*|res|*/uWaitBin(bin, tc)  sUSV_WaitBin(bin, tc)

/* 获取 */
#define /*|res|*/uTakeBin(bin, tc)  sUSV_TakeBin(bin, tc)
#define /*|res|*/tTakeBin(bin)      sTSV_TakeBin(bin)
#define /*|res|*/iTakeBin(bin)      sISV_TakeBin(bin)

/* 释放 */
#define uGiveBin(bin)               bin = true
#define tGiveBin(bin)               bin = true
#define iGiveBin(bin)               sPSV_WriteBin(bin, true)

/* 上锁 */
#define uLockBin(bin)               bin = false
#define tLockBin(bin)               bin = false
#define iLockBin(bin)               sPSV_WriteBin(bin, false)

/* 查询（直接查询即可）*/



/*
 * 计数信号量
 */

/* 声明 */
#define uExternSem(sem)            sCSV_ExternSem(sem)

/* 创建 */
#define uCreateSem(sem, init, max) sCSV_CreateSem(sem, init, max)

/* 获取（中断中不可获取）*/
#define /*|res|*/uTakeSem(sem, tc) sUSV_TakeSem(sem, tc)
#define /*|res|*/tTakeSem(sem)     sTSV_TakeSem(sem)

/* 释放 */
#define uGiveSem(sem)              sUSV_GiveSem(sem)
#define tGiveSem(sem)              sTSV_GiveSem(sem)
#define iGiveSem(sem)              sPSV_GiveSem(sem)



/*
 * 定时中断
 */

/* 定时中断滴答周期 */
#define uTimInt_tc(tmid, tc)       sUSV_TimInt(tmid, tc)
#define tTimInt_tc(tmid, tc)       sTSV_TimInt(tmid, tc)
#define iTimInt_tc(tmid, tc)       sPSV_TimInt(tmid, tc)

/* 定时中断毫秒 */
#define uTimInt_ms(tmid, ms)       uTimInt_tc(tmid, (1000UL * ms) / SYSCFG_SYSTICKCYCLE)
#define tTimInt_ms(tmid, ms)       tTimInt_tc(tmid, (1000UL * ms) / SYSCFG_SYSTICKCYCLE)
#define iTimInt_ms(tmid, ms)       iTimInt_tc(tmid, (1000UL * ms) / SYSCFG_SYSTICKCYCLE)

/* 定时中断秒钟 */
#define uTimInt_s(tmid, s)         uTimInt_ms(tmid, 1000UL * s)
#define tTimInt_s(tmid, s)         tTimInt_ms(tmid, 1000UL * s)
#define iTimInt_s(tmid, s)         iTimInt_ms(tmid, 1000UL * s)

/* 定时中断分钟 */
#define uTimInt_m(tmid, m)         uTimInt_s(tmid, 60UL * m)
#define tTimInt_m(tmid, m)         tTimInt_s(tmid, 60UL * m)
#define iTimInt_m(tmid, m)         iTimInt_s(tmid, 60UL * m)

/* 定时中断小时 */
#define uTimInt_h(tmid, h)         uTimInt_m(tmid, 60UL * h)
#define tTimInt_h(tmid, h)         tTimInt_m(tmid, 60UL * h)
#define iTimInt_h(tmid, h)         iTimInt_m(tmid, 60UL * h)

/* 定时中断定时器自动重装载 */
#define xTimInt_AutoReload(tmid, arl)  s_timint_autoreload[tmid] = arl



/*
 * 定时查询
 */

/* 定时查询滴答周期 */
#define uTimQry_tc(tmid, tc)       sUSV_TimQry(tmid, tc)
#define tTimQry_tc(tmid, tc)       sTSV_TimQry(tmid, tc)
#define iTimQry_tc(tmid, tc)       sPSV_TimQry(tmid, tc)

/* 定时查询毫秒 */
#define uTimQry_ms(tmid, ms)       uTimQry_tc(tmid, (1000UL * ms) / SYSCFG_SYSTICKCYCLE)
#define tTimQry_ms(tmid, ms)       tTimQry_tc(tmid, (1000UL * ms) / SYSCFG_SYSTICKCYCLE)
#define iTimQry_ms(tmid, ms)       iTimQry_tc(tmid, (1000UL * ms) / SYSCFG_SYSTICKCYCLE)

/* 定时查询秒钟 */
#define uTimQry_s(tmid, s)         uTimQry_ms(tmid, 1000UL * s)
#define tTimQry_s(tmid, s)         tTimQry_ms(tmid, 1000UL * s)
#define iTimQry_s(tmid, s)         iTimQry_ms(tmid, 1000UL * s)

/* 定时查询分钟 */
#define uTimQry_m(tmid, m)         uTimQry_s(tmid, 60UL * m)
#define tTimQry_m(tmid, m)         tTimQry_s(tmid, 60UL * m)
#define iTimQry_m(tmid, m)         iTimQry_s(tmid, 60UL * m)

/* 定时查询小时 */
#define uTimQry_h(tmid, h)         uTimQry_m(tmid, 60UL * h)
#define tTimQry_h(tmid, h)         tTimQry_m(tmid, 60UL * h)
#define iTimQry_h(tmid, h)         iTimQry_m(tmid, 60UL * h)

/* 定时查询定时器自动重装载 */
#define xTimQry_AutoReload(tmid, arl)  s_timqry_autoreload[tmid] = arl



/*
 * 私信
 */

/* 接收私信 */
#define /*|res|*/uRecvTaskMsg(tc)    sUSV_RecvTaskMsg(tc)

/* 发送私信 */
#define uSendTaskMsg(task)/*<...)>*/ sUSV_SendTaskMsg(task)
#define tSendTaskMsg(task)/*<...)>*/ sTSV_SendTaskMsg(task)

/* API简化 */
#define uRecvTM uRecvTaskMsg
#define uSendTM uSendTaskMsg
#define tSendTM tSendTaskMsg



/*
 * 飞信
 */

/* 声明信箱 */
#define uExternFetion(tbox)             sCSV_ExternFetion(tbox)

/* 创建信箱 */
#define uCreateFetion(tbox)             sCSV_CreateFetion(tbox)

/* 接收飞信 */
#define /*|tion|*/uRecvFetion(tbox, tc) sUSV_RecvFetion(tbox, tc)
#define /*|tion|*/tRecvFetion(tbox)     sTSV_RecvFetion(tbox)
#define /*|tion|*/iRecvFetion(tbox)     sISV_RecvFetion(tbox)

/* 发送飞信 */
#define uSendFetion(tbox, tion)         tbox = tion
#define tSendFetion(tbox, tion)         tbox = tion
#define iSendFetion(tbox, tion)         sPSV_SendFetion(tbox, tion)

/* API简化 */
#define uRecvFet uRecvFetion
#define tRecvFet tRecvFetion
#define iRecvFet iRecvFetion
#define uSendFet uSendFetion
#define tSendFet tSendFetion
#define iSendFet iSendFetion



/*
 * 消息邮箱
 */

/* 声明邮箱 */
#define uExternMailbox(mbox, type)         sCSV_ExternMailbox(mbox, type)

/* 创建邮箱 */
#define uCreateMailbox(mbox, type)         sCSV_CreateMailbox(mbox, type)

/* 接收邮件 */
#define /*|res|*/uRecvMail(mail, mbox, tc) sUSV_RecvMail(mail, mbox, tc)
#define /*|res|*/tRecvMail(mail, mbox)     sTSV_RecvMail(mail, mbox)
#define /*|res|*/iRecvMail(mail, mbox)     sISV_RecvMail(mail, mbox)

/* 发送邮件 */
#define uSendMail(mbox, mail)              sUSV_SendMail(mbox, mail)
#define tSendMail(mbox, mail)              sTSV_SendMail(mbox, mail)
#define iSendMail(mbox, mail)              sPSV_SendMail(mbox, mail)



/*
 * 消息队列
 */

/* 声明静态消息队列 */
#define uExternMsgQueue_Static(que)             sCSV_ExternMsgQueue_Static(que)

/* 声明动态消息队列 */
#define uExternMsgQueue_Dynamic(que)            sCSV_ExternMsgQueue_Dynamic(que)

/* 创建静态消息队列 */
#define uCreateMsgQueue_Static(que, mode, len)  sCSV_CreateMsgQueue_Static(que, mode, len)

/* 创建动态消息队列 */
#define uCreateMsgQueue_Dynamic(que, mode, len) sCSV_CreateMsgQueue_Dynamic(que, mode, len)

/* 接收消息 */
#define /*|msgptr|*/uRecvMsg(que, tc)           sUSV_RecvMsg((s_msgqueue_tsp)&que, tc)
#define /*|msgptr|*/tRecvMsg(que)               sTSV_RecvMsg((s_msgqueue_tsp)&que)
#define /*|msgptr|*/iRecvMsg(que)               sISV_RecvMsg((s_msgqueue_tsp)&que)

/* 发送消息 */
#define /*|ecode|*/uSendMsg(que, msg)           sUSV_SendMsg((s_msgqueue_tsp)&que, msg)
#define /*|ecode|*/tSendMsg(que, msg)           sTSV_SendMsg((s_msgqueue_tsp)&que, msg)
#define            iSendMsg(que, msg)           sPSV_SendMsg((s_msgqueue_tsp)&que, msg)



/*
 * 事件标志组
 */

/* 声明标志组 */
#define uExternFlagGroup(group, bits)       sCSV_ExternFlagGroup(group, bits)

/* 定义标志位 */
#define uDefFlagBit(bit)                    sDefBitField(bit)

/* 定义空位 */
#define uDefVoidBits(nvb)                   sDefVoidBits(nvb)

/* 创建标志组 */
#define uCreateFlagGroup(group)/*[={...}]*/ sCSV_CreateFlagGroup(group)

/* 等待标志组 */
#define /*|res|*/uWaitFlagGroup(group, tc)  sUSV_WaitFlagGroup(group, tc)

/* 查询标志组 */
#define /*|res|*/uQueryFlagGroup(group)     sUSV_QueryFlagGroup(group)
#define /*|res|*/tQueryFlagGroup(group)     sTSV_QueryFlagGroup(group)
#define /*|res|*/iQueryFlagGroup(group)     sISV_QueryFlagGroup(group)

/* 清除标志组 */
#define uClearFlagGroup(group)              sUSV_ClearFlagGroup(group)
#define tClearFlagGroup(group)              sTSV_ClearFlagGroup(group)
#define iClearFlagGroup(group)              sPSV_ClearFlagGroup(group)

/* 查询标志位（任务、滴答、中断中，均直接查询）*/

/* 设置标志位（滴答中直接设置，任务中也可在任务临界区中设置）*/
#define uSetFlagBit(group, bit)             sUSV_WriteFlagBit(group, bit, true)
#define iSetFlagBit(group, bit)             iSetFlagBits(group, 1) bit)

/* 清除标志位（滴答中直接清除，任务中也可在任务临界区中清除）*/
#define uClearFlagBit(group, bit)           sUSV_WriteFlagBit(group, bit, false)
#define iClearFlagBit(group, bit)           iClearFlagBits(group, 1) bit)

/* 设置多标志位（滴答中直接设置，任务中在任务临界区中设置）*/
#define iSetFlagBits(group, nbit)/*<...)>*/   sPSV_WriteFlagBits(group, +, nbit)

/* 清除多标志位（滴答中直接清除，任务中在任务临界区中清除）*/
#define iClearFlagBits(group, nbit)/*<...)>*/ sPSV_WriteFlagBits(group, -, nbit)



/*
 * 软件RTC
 */

/* 获取时间 */
#define uGetTime(t)       uReadGAry(t, &s_rtc, sizeof(s_rtc))
#define tGetTime(t)       s_memcpy (t, &s_rtc, sizeof(s_rtc))
#define iGetTime(t)       iReadGAry(t, &s_rtc, sizeof(s_rtc))

/* 设置时间 */
#define uSetTime(t)       uWriteGAry(&s_rtc, t, sizeof(s_rtc))
#define tSetTime(t)       tWriteGAry(&s_rtc, t, sizeof(s_rtc))
#define iSetTime(t)       iWriteGAry(&s_rtc, t, sizeof(s_rtc))



/*
 * 进程内存
 */

/* malloc */
#define /*|ptr|*/uMalloc(size)        sUSV_Malloc(size)

/* calloc */
#define /*|ptr|*/uCalloc(nmemb, size) sUSV_Calloc(nmemb, size)

/* realloc */
#define /*|ptr|*/uRealloc(p, size)    sUSV_Realloc(p, size)

/* free */
#define uFree(p)                      sUSV_Free(p)



/*
 * 线程内存
 */

/* 创建线程内存池 */
#define uCreateMempool              sCSV_CreateMempool

/* 初始化线程内存池 */
#define /*|res|*/uInitMempool(size) sUSV_InitMempool(size)

/* 线程内存分配 */
#define /*|ptr|*/uTalloc(size)      sUSV_Talloc(size)

/* 释放线程内存池 */
#define uFreeMempool                sUSV_FreeMempool



/*
 * 全局变量访问
 */

/* 读全局变量（滴答中直接读，任务中也可在任务临界区中读）*/
#define /*|gv|*/uReadGVar(gv)           sUSV_ReadGVar(gv)
/* [GNU] */                             #if MCUCFG_GNU == __ENABLED__
#define /*|gv|*/iReadGVar(gv)           sISV_ReadGVar(gv, typeof(gv))
/* [!GNU] */                            #else
#define /*|gv|*/iReadGVar(gv, type)     sISV_ReadGVar(gv, type)
                                        #endif
/* 读全局数组（滴答中直接memcpy，任务中也可在任务临界区中memcpy）*/
#define         uReadGAry(lp, gp, size) sUSV_ReadGAry(lp, gp, size)
#define /*|lp|*/iReadGAry(lp, gp, size) sISV_ReadGAry(lp, gp, size)

/* 读全局字符串（滴答中直接strcpy，任务中也可在任务临界区中strcpy）*/
#define         uReadGStr(ls, gs)       sUSV_ReadGStr(ls, gs)
#define /*|ls|*/iReadGStr(ls, gs)       sISV_ReadGStr(ls, gs)

/* 写全局变量 */
#define uWriteGVar(gv, lp)              sUSV_WriteGVar(&gv, lp, sizeof(gv))
#define tWriteGVar(gv, lp)              sTSV_WriteGVar(&gv, lp, sizeof(gv))
#define iWriteGVar(gv, lp)              sPSV_WriteGVar(&gv, lp, sizeof(gv))

/* 写全局数组 */
#define uWriteGAry(gp, lp, size)        sUSV_WriteGVar(gp, lp, size)
#define tWriteGAry(gp, lp, size)        sTSV_WriteGVar(gp, lp, size)
#define iWriteGAry(gp, lp, size)        sPSV_WriteGVar(gp, lp, size)

/* 写全局字符串 */
#define uWriteGStr(gs, ls)              sUSV_WriteGVar(gs, ls, 0)
#define tWriteGStr(gs, ls)              sTSV_WriteGVar(gs, ls, 0)
#define iWriteGStr(gs, ls)              sPSV_WriteGVar(gs, ls, 0)

/* 全局变量自运算 */
/* [GNU] */                             #if MCUCFG_GNU == __ENABLED__
#define uSelfOpe(gv, fp)                sUSV_SelfOpe(gv, typeof(gv), fp)
#define tSelfOpe(gv, fp)                sTSV_SelfOpe(gv, typeof(gv), fp)
#define iSelfOpe(gv, fp)                sPSV_SelfOpe(gv, typeof(gv), fp)
/* [!GNU] */                            #else
#define uSelfOpe(gv, type, fp)          sUSV_SelfOpe(gv, type, fp)
#define tSelfOpe(gv, type, fp)          sTSV_SelfOpe(gv, type, fp)
#define iSelfOpe(gv, type, fp)          sPSV_SelfOpe(gv, type, fp)
                                        #endif


/*
 * DEBUG
 */

#define iDebugSend iTimQry_ms(OS_TMID_DEBUGHOOK, 40)
#define iDebugRecv iTimInt_ms(OS_TMID_DEBUGGER, 20)

#if false
/* 应用示例 - 8051/80251 UART1 */
void UART1_Isr(void) interrupt 4
{
	if(TI){
		TI = 0;
		if(*s_debug_sendptr){
			SBUF = *s_debug_sendptr++;
		}
		else{
			iDebugSend;
		}
	}
	if(RI){
		RI = 0;
		if(s_debug_recvptr - s_debug_recvbuff < OS_DEBUGRECVBUFFSIZE - 1){
			*s_debug_recvptr++ = SBUF;
		}
		iDebugRecv;
	}
}

/* 应用示例 - STM32 USART1 */
void USART1_IRQHandler(void)
{
	if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET){
		if(*s_debug_sendptr){
			USART_SendData(USART1, *s_debug_sendptr++);
		}
		else{
			USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
			iDebugSend;
		}
	}
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){
		if(s_debug_recvptr - s_debug_recvbuff < OS_DEBUGRECVBUFFSIZE - 1){
			*s_debug_recvptr++ = USART_ReceiveData(USART1);
		}
		iDebugRecv;
	}
}

#endif



/*
 * 任务调度
 * 由用户手动触发的临时性的任务调度
 */

/* 任务级任务调度 */
#define uTaskScheduling su_task_scheduling()

/* 中断级任务调度 */
#define iTaskScheduling \
do{ \
	s_sign_scheduling = true; \
	mPendSV_Set; \
}while(false)



/*
 * 任务临界区
 * 任务级的临界区保护，仅关闭SysTick、PendSV，仅支持在任务中调用。
 */

/* 进入临界区 */
#if SYSCFG_TASKCRITICAL_RECURSION == __ENABLED__
#define uEnterCritical muReEnterCritical
#else
#define uEnterCritical muEnterCritical
#endif

/* 退出临界区 */
#if SYSCFG_TASKCRITICAL_RECURSION == __ENABLED__
#define uExitCritical  muReExitCritical
#else
#define uExitCritical  muExitCritical
#endif



/*
 * 全局临界区
 * 系统级的临界区保护，会关闭总中断，支持在任意处调用。
 * CosyOS内核中从来不会进入全局临界区，提供此项服务只是为了便于用户对全局公共资源和程序过程的保护。
 */

/* [ARM] */#if MCUCFG_ISA == __ARM__

/* 方法一：操作PRIMASK */
#define /*|oldirq|*/xDisableIRQ         mxDisableIRQ         // 进入全局临界区
#define             xResumeIRQ(oldirq)  mxResumeIRQ(oldirq)  // 退出全局临界区

/* 方法二：操作FAULTMASK */
#define /*|oldfiq|*/xDisableFIQ         mxDisableFIQ         // 进入全局临界区
#define             xResumeFIQ(oldfiq)  mxResumeFIQ(oldfiq)  // 退出全局临界区

/* 方法三：操作BASEPRI */
#define /*|oldpri|*/xMaskingPRI(newpri) mxMaskingPRI(newpri) // 进入全局临界区
#define             xResumePRI(oldpri)  mxResumePRI(oldpri)  // 退出全局临界区

/* [!ARM] */#else

/* 操作EA */
#define xDisableIRQ mxDisableIRQ // 进入全局临界区
#define xResumeIRQ  mxResumeIRQ  // 退出全局临界区

#endif



#endif
